﻿// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动！任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任！

using Admin.NET.Core.Service;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IES.NET.Application;
/// <summary>
/// 系统用户分组信息服务
/// </summary>
/// 

[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)]
public class UserGroupService : IDynamicApiController, ITransient
{
    private readonly SqlSugarRepository<SysUser> _sysUserRep;
    private readonly SysOrgService _sysOrgService;
    private readonly UserManager _userManager;

    public UserGroupService(
        SqlSugarRepository<SysUser> sysUserRep,
        SysOrgService sysOrgService,
        UserManager userManager)
    {
        _sysUserRep = sysUserRep;
        _sysOrgService = sysOrgService;
        _userManager = userManager;
    }

    /// <summary>
    /// 获取用户信息集合(按RealName分组)
    /// </summary>
    /// <returns>Dictionary<string, List<UserGroupInfoOutput>></returns>
    [DisplayName("获取用户信息分组集合")]
    [HttpGet]
    [ApiDescriptionSettings(Name = "GetUserGroupList")]
    public async Task<Dictionary<string, List<UserGroupInfoOutput>>> GetUserGroupList()
    {
        // 获取用户拥有的机构集合
        var userOrgIdList = await _sysOrgService.GetUserOrgIdList();

        // 管理员可以看到所有用户，其他用户只能看到自己机构下的用户
        var orgList = _userManager.SuperAdmin ? null : userOrgIdList;

        // 查询用户列表
        var userList = await _sysUserRep.AsQueryable()
            .LeftJoin<SysOrg>((u, o) => u.OrgId == o.Id)
            .LeftJoin<SysPos>((u, o, p) => u.PosId == p.Id)
            .Where(u => u.AccountType != AccountTypeEnum.SuperAdmin)
            .WhereIF(orgList != null, u => orgList.Contains(u.OrgId))
            .Select((u, o, p) => new UserGroupInfoOutput
            {
                Id = u.Id,
                Account = u.Account,
                RealName = u.RealName,
                NickName = u.NickName,
                Age = u.Age,
                Birthday = u.Birthday,
                Phone = u.Phone,
                Sex = u.Sex,
                Email = u.Email,
                Avatar = u.Avatar,
                OrgId = u.OrgId,
                OrgName = o.Name,
                PosId = u.PosId,
                PosName = p.Name,
                JobNum = u.JobNum,
                Introduction = u.Introduction,
                LastLoginTime = u.LastLoginTime,
                LastLoginIp = u.LastLoginIp,
                LastLoginAddress = u.LastLoginAddress,
                LastLoginDevice = u.LastLoginDevice,
                Status = u.Status
            })
            .ToListAsync();

        // 按RealName分组
        return userList.GroupBy(u => u.RealName)
                      .ToDictionary(g => g.Key, g => g.ToList());
    }
}
